package org.finesys.ai.core;

import org.finesys.ai.core.balance.BalanceResponse;
import org.finesys.ai.core.chat.ChatCompletionRequest;
import org.finesys.ai.core.chat.ChatCompletionResponse;
import org.finesys.ai.core.completion.CompletionRequest;
import org.finesys.ai.core.completion.CompletionResponse;
import org.finesys.ai.core.embedding.EmbeddingRequest;
import org.finesys.ai.core.embedding.EmbeddingResponse;
import org.finesys.ai.core.image.GenerateImagesRequest;
import org.finesys.ai.core.image.GenerateImagesResponse;
import org.finesys.ai.core.models.ModelsResponse;
import org.finesys.ai.core.moderation.ModerationRequest;
import org.finesys.ai.core.moderation.ModerationResponse;
import retrofit2.Call;
import retrofit2.http.*;

import java.util.Map;

interface OpenAiApi {
    /**
     * 发送代码补全请求。
     *
     * @param request    代码补全请求对象，包含补全代码的相关信息。
     * @param apiVersion API版本号，用于指定使用哪个版本的API。
     * @return 返回Call对象，表示异步请求的结果，其中包含补全代码的响应信息。
     */
    @POST("completions")
    @Headers("Content-Type: application/json")
    Call<CompletionResponse> completions(@Body CompletionRequest request,
                                         @Query("api-version") String apiVersion);

    /**
     * 向服务器发送请求，获取补全结果。
     *
     * @param headers    请求头信息，包含各种自定义的HTTP头部信息
     * @param request    请求体，包含补全请求的具体内容
     * @param apiVersion API版本号，用于指定请求所依赖的API版本
     * @return 返回一个Call对象，用于异步获取补全结果
     * @throws RetrofitError 如果请求失败，会抛出RetrofitError异常
     */
    @POST("completions")
    @Headers("Content-Type: application/json")
    Call<CompletionResponse> completions(
            @HeaderMap Map<String, String> headers,
            @Body CompletionRequest request,
            @Query("api-version") String apiVersion);

    /**
     * 发送聊天补全请求
     *
     * @param request    请求体，包含聊天补全所需的信息
     * @param apiVersion API版本号
     * @return Call对象，包含异步请求的响应结果，类型为ChatCompletionResponse
     */
    @POST("chat/completions")
    @Headers("Content-Type: application/json")
    Call<ChatCompletionResponse> chatCompletions(
            @Body ChatCompletionRequest request,
            @Query("api-version") String apiVersion
    );

    /**
     * 发送聊天补全请求
     *
     * @param headers    请求头信息
     * @param request    聊天补全请求体
     * @param apiVersion API版本
     * @return 返回一个Call对象，其中包含ChatCompletionResponse类型的响应
     */
    @POST("chat/completions")
    @Headers("Content-Type: application/json")
    Call<ChatCompletionResponse> chatCompletions(
            @HeaderMap Map<String, String> headers,
            @Body ChatCompletionRequest request,
            @Query("api-version") String apiVersion
    );

    /**
     * 发送一个POST请求到"embeddings"端点，以获取嵌入结果。
     *
     * @param request    请求体，类型为EmbeddingRequest，包含嵌入所需的参数。
     * @param apiVersion 查询参数，指定API的版本号。
     * @return 返回Call<EmbeddingResponse>对象，表示异步请求的结果。
     */
    @POST("embeddings")
    @Headers("Content-Type: application/json")
    Call<EmbeddingResponse> embeddings(
            @Body EmbeddingRequest request,
            @Query("api-version") String apiVersion);

    /**
     * 发送请求以获取嵌入向量
     *
     * @param headers    自定义的HTTP头信息
     * @param request    包含请求数据的请求体
     * @param apiVersion API的版本号
     * @return 包含嵌入向量的响应
     */
    @POST("embeddings")
    @Headers("Content-Type: application/json")
    Call<EmbeddingResponse> embeddings(
            @HeaderMap Map<String, String> headers,
            @Body EmbeddingRequest request,
            @Query("api-version") String apiVersion);

    /**
     * 发送请求进行内容审核
     *
     * @param request    请求体，包含需要审核的内容信息
     * @param apiVersion API版本，指定要使用的API版本
     * @return 返回审核结果
     */
    @POST("moderations")
    @Headers("Content-Type: application/json")
    Call<ModerationResponse> moderations(
            @Body ModerationRequest request,
            @Query("api-version") String apiVersion);

    /**
     * 发送审核请求。
     *
     * @param headers    请求头，可包含自定义的请求头信息
     * @param request    审核请求体，包含需要审核的内容等信息
     * @param apiVersion API版本号，用于指定使用的API版本
     * @return 包含审核结果的响应体
     */
    @POST("moderations")
    @Headers("Content-Type: application/json")
    Call<ModerationResponse> moderations(
            @HeaderMap Map<String, String> headers,
            @Body ModerationRequest request,
            @Query("api-version") String apiVersion);

    /**
     * 发起POST请求以生成图像
     *
     * @param request    包含生成图像请求信息的对象
     * @param apiVersion API版本
     * @return 返回包含生成图像响应信息的Call对象
     */
    @POST("images/generations")
    @Headers({"Content-Type: application/json"})
    Call<GenerateImagesResponse> imagesGenerations(
            @Body GenerateImagesRequest request,
            @Query("api-version") String apiVersion
    );

    /**
     * 生成图片接口
     *
     * @param headers    请求头信息，包括自定义的认证信息等
     * @param request    包含生成图片所需信息的请求体
     * @param apiVersion API版本号
     * @return 返回生成图片响应的Call对象
     */
    @POST("images/generations")
    @Headers({"Content-Type: application/json"})
    Call<GenerateImagesResponse> imagesGenerations(
            @HeaderMap Map<String, String> headers,
            @Body GenerateImagesRequest request,
            @Query("api-version") String apiVersion
    );

    /**
     * 发起GET请求获取模型数据
     *
     * @param headers    自定义HTTP头部信息
     * @param apiVersion API版本
     * @return Call对象，用于异步处理HTTP响应
     */
    @GET("models")
    @Headers("Content-Type: application/json")
    Call<ModelsResponse> models(@HeaderMap Map<String, String> headers, @Query("api-version") String apiVersion);

    /**
     * 发起GET请求获取余额数据
     *
     * @param headers 自定义HTTP头部信息
     * @return Call对象，用于异步处理HTTP响应
     */
    @GET("user/balance")
    @Headers("Content-Type: application/json")
    Call<BalanceResponse> balance(@HeaderMap Map<String, String> headers);

}
